<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>function详解</title>
</head>
<body>
	<script type="text/javascript">
		//js代码运行分为两个阶段   可以先调用再定义
		// 1.预解析---把所有的函数定义提前，所有的变量声明提前，变量的赋值不提前
		// 2.执行---从上到下  (setTimeout,setInterval,ajax中的回调函数，时间中的函数需要触发执行)
		// fn();
		// function fn(){
		// 	console.log(111);    
		// }

		// fn1();
		// var fn1 = function(){
		// 	console.log(222);
		// }
 



 		//函数的参数可以是一个函数，这个函数可以直接调用 也
 		//函数可以作为返回值   函数的嵌套可以形成一个闭包

		var obj = {
			name:"xiaosan",
			say:function(){
				console.log(333);
			}
		};

		var cb = function(){
			console.log(444);
		}

		function fn2(callback){
			callback();
		}
		fn2(obj.say);


		function fn3(){
			var n = 1;
			var fn = function(){
				n++;
				console.log(n);
			}
			return fn;
		}

		var fn4 = fn3();
		fn4();
		fn4();
		fn4();


		//js for循环中没用作用域 变量属于全局变量
		// var data = [];
		// for(var i=0; i<3; i++){
		// 	data[i] = function(){
		// 		console.log(i);
		// 	}
		// }
		// data[0]();
		// data[1]();
		// data[2]();





		//函数嵌套 形成闭包 缓存中间值 与全局变量独立开来
		var i=3;
		var data = [];
		for(var i=0; i<3; i++){
			data[i] = (function(k){
				return function(){
				console.log(k);
				}
				
			})(i);
		}
		data[0]();
		data[1]();
		data[2]();




		//function有双重身份  1.对象  2.构造函数

		function JuiceMachine(fruit){
			this.fruit = fruit;
			this.produceJuice = function(){
				console.log(this.fruit + '果汁');
			}
		}

		var apple = new JuiceMachine("苹果");
		apple.produceJuice();

		var orange = new JuiceMachine("橘子");
		orange.produceJuice();



	</script>
</body>
</html>